#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/sysfs.h>
#include <linux/slab.h>

extern int soc_get_serial_str(char *serial);
// 用于读取soc_info文件时返回内容的函数
static ssize_t soc_info_show(struct class *class, struct class_attribute *attr,
			char *buf)
{
	char tmp_buf[128] = {0};

	soc_get_serial_str(tmp_buf);
	return sysfs_emit(buf, "soc sn\t: 0x%s\n", tmp_buf);
}


struct class *dev_info_class;
// 定义设备属性结构体
static CLASS_ATTR_RO(soc_info);
// 模块初始化函数
static int __init device_info_init(void)
{
	int ret;

	// 创建class对象，这里创建一个名为"my_device_class"的class，你可以根据实际需求修改名称
	dev_info_class = class_create(THIS_MODULE, "dev_info");
	if (IS_ERR(dev_info_class)) {
		return PTR_ERR(dev_info_class);
	}

	// 使用class_create_file在class对应的目录下创建文件
	class_attr_soc_info.show = soc_info_show;
	ret = class_create_file(dev_info_class, &class_attr_soc_info);
	if (ret) {
		class_destroy(dev_info_class);
		return ret;
	}

	return 0;
}

// 模块卸载函数，用于清理相关资源
static void __exit device_info_exit(void)
{
	if (dev_info_class) {
		class_remove_file(dev_info_class, &class_attr_soc_info);
		class_destroy(dev_info_class);
	}
}

module_init(device_info_init);
module_exit(device_info_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("lwl");
MODULE_DESCRIPTION("display soc info in /sys/class/dev_info/soc_info");

